使用 Terraform 和 cloud

您所在的位置:网站首页 oracle purge命令 使用 Terraform 和 cloud

使用 Terraform 和 cloud

#使用 Terraform 和 cloud| 来源: 网络整理| 查看: 265

注意:

此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值替代為您雲端環境特定的值。 使用 Terraform 和 cloud-init 命令檔將保留的 IP 連附至 Oracle Cloud Infrastructure 運算執行處理 簡介

在基礎架構即程式碼 (IaC) 的世界中,將運算執行處理的佈建和組態自動化,對於有效率且可擴展的雲端部署來說至關重要。將保留的 IP 位址連附至 Oracle Cloud Infrastructure (OCI) 運算執行處理時,Terraform 和 cloud-init 都會提供強大的組合。

在 OCI Compute Terraform 模組中,無法選擇在建立執行處理時,將保留的 IP 連附至運算執行處理。您只能在建立執行處理之後連附保留的 IP。在本部落格文章中,我們將探討如何運用 Terraform 和 cloud-init 命令檔,以無縫接軌的方式將保留的 IP 連附至 OCI 運算執行處理。

目標

使用 Terraform 與 cloud-init 命令檔,以無縫接軌的方式將保留的 IP 連附至 OCI 運算執行處理。

什麼是保留 IP?

保留的 IP 位址是指定給虛擬網路內運算執行處理的靜態 IP。它可以確保需要固定 IP 的應用程式保持一致的連線,並簡化網路管理。保留的 IP 經常用於負載平衡、防火牆規則及安全網路通訊等情況。

必要條件

首先,您需要存取 OCI 環境。如果您還沒有 Always Free 執行處理,您可以輕鬆建立具備大量免費容量和價值 300 美元的試用點數。

如果您有環境,請確定您的使用者已指定給具備管理 instance-family 資源和 storage-family 之權限的群組。您會建立一個安全最佳做法,而不是使用已經指派權限的主控台使用者。若您需要協助,請取出文件來建立群組,並將適當的權限授予使用者。

OCI 帳戶 Terraform 存取權。如需詳細資訊,請參閱此連結。 將在其中啟動執行處理的公用子網路。這必須連附至網際網路閘道。 會建立次要 VNIC 並指定保留 IP 的專用子網路。這必須連附至服務閘道。 群組中的資源需有管理網路系列權限的動態群組。 必須為執行處理主體認證設定原則。 作業 1:設定 Terraform 命令檔

我們會將 cloud-init 命令檔新增為 OCI Terraform 建立運算執行處理模組的描述資料。此外,我們會將保留的 IP OCID 和專用子網路 OCID 傳送到運算 VM,成為自由格式標記。

resource "oci_core_public_ip" "pubip" { # In case of Multiple Instances has to be created, Provide the count in the vars file. # This block creates a Reserved Public IP from Oracle IP Pool count = var.instance_count compartment_id = var.compartment_id display_name = var.res_ip_display_name lifetime = "RESERVED" private_ip_id = "" } resource "oci_core_instance" "pubiptest" { count = var.instance_count compartment_id = var.compartment_id availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name display_name = var.display_name shape = var.shape # We will pass Reserved Public IP OCID and Private Subnet OCID as a freeform tags to the instance freeform_tags = { "publicIP" = resource.oci_core_public_ip.pubip[count.index].id "SubnetId" = var.private_subnet_id } create_vnic_details { display_name = var.vnic_display_name assign_public_ip = true subnet_id = var.public_subnet_id } source_details { source_type = var.source_type source_id = var.source_id } metadata = { ssh_authorized_keys = var.pub_key user_data = "${base64encode(file("./cloud-init.sh"))}" } }

上述命令檔會建立一個保留的 IP (考慮計數變數值),並且會以臨時 IP (會連附至主要 VNIC) 的方式啟動運算執行處理。

在運算描述資料中,我們會傳送 cloud-init 命令檔,此命令檔會透過取代現有的臨時 IP 來指定保留的 IP。

作業 2:瞭解 cloud-init 命令檔 Task 2.1:安裝 OCI CLI 和其他必要工具

使用下列命令安裝 OCI CLI 和 jq (剖析 JSON)。

`sudo yum install -y python36-oci-cli jq` 作業 2.2:擷取執行處理描述資料

使用執行處理描述資料服務,其中提供從網路、磁碟區等執行中執行處理的相關資訊。這會擷取執行處理 OCID、區間 ID、subnetID (以自由格式標記傳送的專用子網路 OCID) 及 publicIP (以自由格式標記形式傳送的保留 IPOCID) (也包含自由格式標記值)。

metadata=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v2/instance) instanceid=$(echo $metadata | jq -r '.id') compartmentid=$(echo $metadata | jq -r '.compartmentId') subnetid=$(echo $metadata | jq -r '.freeformTags.SubnetId') publicIp=$(echo $metadata | jq -r '.freeformTags.publicIP')

使用 oci-cli 擷取主要 VNIC OCID、專用 IP ID (指定給主要 VNIC 的專用 IP 的 OID)、臨時公用 IP 以及臨時公用 IP OCID

primaryvnicid=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v1/vnics/ | jq -r '.[].vnicId') privateIpId=$(oci network private-ip list --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data[].id') ephpublicIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') ephpublicIpId=$( oci network public-ip get --auth instance_principal --public-ip-address $ephpublicIp | jq -r '.data.id') 作業 2.3:連附次要 VNIC

請執行下列命令,將次要 VNIC 連附至將使用專用子網路的運算 VM。

oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait Task 2.4:設定路由

建立次要 VNIC 並連附至 VM 之後,我們將會設定次要 VNIC,然後將它們加到路由中。若要設定路由,我們將會使用 Oracle 提供的命令檔。

wget https://docs.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh sudo chmod u+x ./secondary_vnic_all_configure.sh sudo ./secondary_vnic_all_configure.sh -c

組態設定完成之後,您就會看到新增至 VM 路由的新路由。您可以使用 sudo route -n 指令檢查相同內容。

作業 2.5:將次要 VNIC 路由設為預設路由

使用 IDMS 取得次要 VNIC 的閘道 IP。這將會新增至執行處理路由表。

gatewayIP=$(curl http://169.254.169.254/opc/v1/vnics/ | jq -c '.[] | ( select(.vnicId=="'$secondaryvnicid'" ))' | jq -r '.virtualRouterIp')

使用下列指令取得預設網路介面。

iname=$(sudo ./secondary_vnic_all_configure.sh | awk '{print $8}' | awk 'END{print}')

請執行以下命令,將預設路由新增至次要 VNIC。

sudo route add default gw $gatewayIP dev $iname

請使用 sudo route -n 指令再次確認。

作業 2.6:刪除臨時公用 IP

刪除連附至 VM 的臨時公用 IP。因此,我們已將次要 VNIC 設為預設路由,而次要 VNIC 的子網路已存在,因此已將服務閘道連附至該 VNIC,以便與其他 OCI 服務 (在此情況下為 VCN) 進行通訊。

delpubIp=$(oci network public-ip delete --force --auth instance_principal --public-ip-id $ephpublicIpId --wait-for-state TERMINATED)

使用下面的命令來檢查是否已順利刪除臨時 IP。

checkIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') Task 2.7:連附保留的 IP

我們有來自自由格式標記的公用 IP OCID,因此我們已刪除了 Ephermeral IP,因此我們可以將保留的 IP 連附至主要 VNIC。下方命令會將保留的 IP 連附至執行處理的主要 VNIC。

assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED) 作業 2.8:分離次要 VNIC

我們已將「公有 VNIC」連附至主要 VNIC,現在可以取消連附次要 VNIC。請使用下面的命令將次要 VNIC 分離,並相應地更新路由規則。

detach=$(oci compute instance detach-vnic --compartment-id $compartmentid --vnic-id $secondaryvnicid --force --auth instance_principal) sudo ./secondary_vnic_all_configure.sh -d

下列指令碼會將所有步驟一起顯示。此命令檔發生失敗時最多可重試 3 次,而且可以使用 OCI 事件服務設定失敗通知。

#!/bin/bash # coding: utf-8 sudo yum install -y python36-oci-cli function getdetails() { # Fetch data using instance principal authentication metadata=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v2/instance) instanceid=$(echo $metadata | jq -r '.id') compartmentid=$(echo $metadata | jq -r '.compartmentId') subnetid=$(echo $metadata | jq -r '.freeformTags.SubnetId') publicIp=$(echo $metadata | jq -r '.freeformTags.publicIP') primaryvnicid=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v1/vnics/ | jq -r '.[].vnicId') privateIpId=$(oci network private-ip list --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data[].id') ephpublicIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') ephpublicIpId=$( oci network public-ip get --auth instance_principal --public-ip-address $ephpublicIp | jq -r '.data.id') if [[ -z "$subnetid" || "$subnetid" == "" || ${#subnetid} == 0 || -z "$publicIp" || ${#publicIp} == 0 || -z "$instanceid" || -z "$compartmentid" || -z "$publicIpData" || -z "$privateIpId" || -z "$primaryvnicid" || -z "$ephpublicIp" || -z "$ephpublicIpId" ]]; then echo "Missing some details, retrying..." return 1 fi return 0 } # Retry the `getdetails` function thrice attachVNIC() { attachvnic=$(oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait) } for i in {1..3}; do getdetails if [[ $? -eq 0 ]]; then attachVNIC if [[ -n "$attachvnic" ]]; then secondaryvnicid=$(echo $attachvnic | jq -r '.data.id') echo $secondaryvnicid check2VNICs=$(oci compute instance list-vnics --instance-id $instanceid --auth instance_principal | jq -r '.data[].id') echo $check2VNICs gatewayIP=$(curl http://169.254.169.254/opc/v1/vnics/ | jq -c '.[] | ( select(.vnicId=="'$secondaryvnicid'" ))' | jq -r '.virtualRouterIp') if [[ (-n "$gatewayIP") ]]; then echo $gatewayIP wget https://docs.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh sudo chmod u+x ./secondary_vnic_all_configure.sh sudo ./secondary_vnic_all_configure.sh -c iname=$(sudo ./secondary_vnic_all_configure.sh | awk '{print $8}' | awk 'END{print}') echo $iname sudo route add default gw $gatewayIP dev $iname route oci os ns get --auth instance_principal delpubIp=$(oci network public-ip delete --force --auth instance_principal --public-ip-id $ephpublicIpId --wait-for-state TERMINATED) checkIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') if [[ -z "$checkIp" || "$checkIp" == "null" ]]; then echo "Assigning Reserved IP" assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED) detach=$(oci compute instance detach-vnic --compartment-id $compartmentid --vnic-id $secondaryvnicid --force --auth instance_principal) sudo ./secondary_vnic_all_configure.sh -d checkIp2=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') echo "Reserved IP $checkIp2" if [[ -z "$checkIp2" ]]; then oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Reserved IP Not Assigned","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi else oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Ephemeral IP Not Deleted","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi break; else oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Gateway IP not fetched","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi else break; fi fi done if [[ -z "$attachvnic" ]]; then echo "Failed" oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Secondary VNIC not attached","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit fi checkVNICs2=$(oci compute instance list-vnics --instance-id $instanceid --auth instance_principal | jq -r '.data | length') if [[ "$checkVNICs2" > 1 ]]; then echo "Detaching Secondary VNIC Failed" oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Detaching Secondary VNIC Failed","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit fi oci compute instance update --instance-id $instanceid --freeform-tags '{"SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal 接下來的步驟

這是一個範例實行,在使用此命令檔作為 cloud-init 命令檔之前,請先進行對應的變更。已經在 Oracle Linux 8 上進行測試。

如果您選擇任何其他的 Linux Flavor,將會變更 oci-cli 安裝程序。如需詳細資訊,請參閱 Installing the CLI 。

相關連結 OCI 運算 OCI 保留 IP OCI Terraform 確認

作者 - Rithesh Subramanian (OCI 雲端架構師)

其他學習資源

探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。

如需產品文件,請造訪 Oracle Help Center 。

標題與版權資訊

Attach a Reserved IP to an Oracle Cloud Infrastructure Compute Instance using Terraform and cloud-init Script

F82850-01

June 2023

Copyright © 2023, Oracle and/or its affiliates.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3